iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0

注入(Injection)
可以理解為實現”依賴”的過程,簡單的說法就是,要怎麼樣讓物件B可以給物件A使用。注入方式有三種:

1. 建構式注入 (Constructor Injection),顧名思義就是從物件初始化時的建構式進行注入,在初始化階段就需要具備所有的依賴類或資源,否則無法完成建立。

  • 優點
    程式碼維護的人員可以一眼就看出哪些東西會需要被注入,依賴關係明確,也能夠確保類對依賴類的完整性。另外,建構式注入的方法讓單元測試變得更加容易,在撰寫單元測試時,可以透過建構式傳遞依賴類,不需要透過其他方式來模擬依賴注入。

  • 缺點
    當一個類有很多的依賴時,建構式的參數列可能會變得很長,增加程式碼的可讀性。

    建構式注入範例如下:

    @Service("TransactionService")
    public class TransactionService{
        @Autowired
        public TransactionService(AccountRepository accountRepository){
            this.accountRepository  = accountRepository;
        }
    
        public void queryAccountAmount(Long accountId) {
            BigDecimal currentBalance = accountRepository.getAccountBalance(accountId);
        }
    }
    

    大部分情況下都應需要使用建構式注入,這也是Spring Boot官方建議使用的注入方法。

2. 屬性注入 (Property Injection),它會直接將依賴類(A.class)注入到類(B.class)的屬性內,在開發上是很常見的方法。

  • 優點
    使用這種方式進行注入的程式碼行數會最少,可以直接在程式碼上加上註解(annotation),不需要額外的建構式或方法。

  • 缺點
    在使用屬性注入時,依賴類是在使用依賴的類創建後透過屬性注入的,在查看類的定義時較難知道該類使用了哪些依賴,使得依賴關係不明確,增加了理解和程式維護的難度。

    屬性注入範例如下:

    @Service("TransactionService")
    public class TransactionService{
        @Autowired
        private AccountRepository accountRepository;
    
        public void queryAccountAmount(Long accountId) {
            BigDecimal currentBalance = accountRepository.getAccountBalance(accountId);
        }
    
    }
    

    用一個例子來說明以上屬性注入的缺點,有一對情侶,在眾人面前不會有太多互動,導致旁人看了都以為他們只是普通朋友,只有真正與之交情好或是更熟悉他們的朋友才知道他們是一對情侶。

3. 方法注入 (Method Injection),指的是將依賴類做為參數傳遞給方法,這種注入方式可以接受方法在執行時動態的提供依賴類,而不需要在類別實體話時就指定所有依賴類。

  • 優點
    允許方法在執行時動態提供依賴,在需要根據執行條件來選擇不同依賴時非常有用。如果該依賴指在某個特定方法中被使用,可以將其放在方法中注入,不需要在類的建構式或屬性中注入,降低耦合。

  • 缺點
    維護者沒辦法透過類的建構式或是屬性來看到全部的依賴關係,會讓程式碼可讀性下降。如果依賴都是透過方法注入,在管理依賴上可能會變得比較麻煩。另外,依賴如果需要在整個類的生命週期中多次使用的話,可能會導致重複的依賴傳遞,此時就比較建議使用建構式注入或屬性注入。

    方法注入範例如下:

    @Service("TransactionService")
    public class TransactionService{
    
        public void queryAccountAmount(Long accountId, AccountRepository accountRepository) {
            BigDecimal currentBalance = accountRepository.getAccountBalance(accountId);
        }
    
    }
    

    雖然Spring Boot 支援方法注入,但還是更建議使用建構式或屬性注入的方式建立依賴關係。


上一篇
Day7 - 依賴注入(上)
下一篇
Day9 - 淺談Bean
系列文
這些年SpringBoot實戰開發教會我的事15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言